/**
 * 标签页工具函数 - 提供处理标签页导航和标签管理的公共方法
 */
import { Router } from "vue-router";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { nextTick } from "vue";
import { ElMessage } from "element-plus";

/**
 * 标签页导航参数
 */
export interface TagNavigationOptions {
  /** 路由路径 */
  path: string;
  /** 路由名称 */
  name: string;
  /** 标签标题 */
  title: string;
  /** 路由参数 */
  params?: Record<string, any>;
  /** 查询参数 */
  query?: Record<string, any>;
  /** 元信息 */
  meta?: {
    /** 是否保持组件状态 */
    keepAlive?: boolean;
    /** 标签图标 */
    icon?: string;
    /** 动态标签上限数 */
    dynamicLevel?: number;
    /** 所属的菜单路径 */
    activeMenu?: string;
    /** 其他元信息 */
    [key: string]: any;
  };
}

/**
 * 打开新标签页
 * @param router Vue Router实例
 * @param options 标签页导航参数
 * @param debugMode 是否启用调试模式，打印日志信息
 * @returns 是否成功打开
 */
export function openInNewTag(
  router: Router,
  options: TagNavigationOptions,
  debugMode = false
): boolean {
  try {
    // 合并默认元信息
    const meta = {
      title: options.title,
      dynamicLevel: 3,
      keepAlive: true,
      ...(options.meta || {})
    };

    // 调试信息
    if (debugMode) {
      console.log(
        "[标签工具] 路由列表:",
        router.getRoutes().map(r => ({ name: r.name, path: r.path }))
      );
      console.log("[标签工具] 目标路径:", options.path);
      console.log("[标签工具] 目标名称:", options.name);
    }

    // 检查路由是否存在
    try {
      const route = router.resolve({
        name: options.name,
        params: options.params || {}
      });

      if (debugMode) {
        console.log("[标签工具] 解析的路由:", route);
      }

      if (!route || !route.name) {
        // 路由名称解析失败，尝试使用路径
        if (debugMode) {
          console.warn("[标签工具] 路由名称解析失败，尝试使用路径解析");
        }

        const pathRoute = router.resolve(options.path);
        if (!pathRoute || pathRoute.matched.length === 0) {
          throw new Error(`无法解析路由: ${options.path}`);
        }
      }
    } catch (error) {
      console.error("[标签工具] 路由解析错误:", error);
      ElMessage.error("路由导航错误：无法解析路由");
      return false;
    }

    // 创建标签对象
    const tag = {
      path: options.path,
      name: options.name,
      meta,
      params: options.params,
      query: options.query
    };

    // 先导航到新页面
    const navPromise = router.push({
      path: options.path,
      query: options.query
    });

    // 导航后添加标签
    navPromise
      .then(() => {
        nextTick(() => {
          // 添加新的页签并激活
          useMultiTagsStoreHook().handleTags("push", tag);

          if (debugMode) {
            console.log("[标签工具] 标签添加成功:", tag);
          }
        });
      })
      .catch(err => {
        console.error("[标签工具] 导航错误:", err);
        ElMessage.error(`导航失败: ${err.message || "未知错误"}`);
        return false;
      });

    return true;
  } catch (error) {
    console.error("[标签工具] 打开标签错误:", error);
    ElMessage.error(`打开标签失败: ${error.message || "未知错误"}`);
    return false;
  }
}

/**
 * 使用路由名称打开新标签页
 * @param router Vue Router实例
 * @param name 路由名称
 * @param title 标签标题
 * @param params 路由参数
 * @param meta 额外元信息
 * @returns 是否成功打开
 */
export function openTagByName(
  router: Router,
  name: string,
  title: string,
  params: Record<string, any> = {},
  meta: Record<string, any> = {}
): boolean {
  // 先解析路由以获取正确的路径
  try {
    const resolved = router.resolve({
      name,
      params
    });

    if (!resolved || !resolved.name) {
      ElMessage.error(`无法解析路由名称: ${name}`);
      return false;
    }

    return openInNewTag(router, {
      path: resolved.path,
      name,
      title,
      params,
      meta
    });
  } catch (error) {
    console.error("[标签工具] 按名称打开标签错误:", error);
    ElMessage.error(`按名称打开标签失败: ${error.message || "未知错误"}`);
    return false;
  }
}

/**
 * 使用路由路径打开新标签页
 * @param router Vue Router实例
 * @param path 路由路径
 * @param title 标签标题
 * @param query 查询参数
 * @param meta 额外元信息
 * @returns 是否成功打开
 */
export function openTagByPath(
  router: Router,
  path: string,
  title: string,
  query: Record<string, any> = {},
  meta: Record<string, any> = {}
): boolean {
  // 先解析路由以获取正确的名称
  try {
    const resolved = router.resolve(path);

    if (!resolved || resolved.matched.length === 0) {
      ElMessage.error(`无法解析路由路径: ${path}`);
      return false;
    }

    return openInNewTag(router, {
      path,
      name: resolved.name as string,
      title,
      query,
      meta
    });
  } catch (error) {
    console.error("[标签工具] 按路径打开标签错误:", error);
    ElMessage.error(`按路径打开标签失败: ${error.message || "未知错误"}`);
    return false;
  }
}
